package com.myh.gulimall.product.config;


import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Description: // 类说明，在创建类时要填写
 * @ClassName: MyThreadPoolConfig    // 类名，会自动填充
 * @Author: MYH          // 创建者
 * @Date: 2024/5/27 15:58   // 时间
 * @Version: 1.0     // 版本
 */
@Configuration
@EnableConfigurationProperties(MyThreadPoolPropertiesConfig.class)
public class MyThreadPoolConfig {

    @Bean
    public ThreadPoolExecutor threadPool(MyThreadPoolPropertiesConfig config) {
        /*
        * 七大参数：
        * 1、核心线程数：就绪的线程数量，等待处理异步任务
        * 2、最大线程数量：用于控制资源
        * 3、存活时间：若当前的线程数量大于核心线程数，并且线程空闲大于指定的存活时间，就会被释放
        * 4、时间单位
        * 5、阻塞队列：如果异步任务有很多，就会将多的放入阻塞队列中。只要有空闲线程，就会去队列中取。
        * 6、线程的创建工厂：
        * 7、处理器：如果阻塞队列满了，按照指定的拒绝策略拒绝执行任务
        * 工作顺序：
        * 1、线程池创建好，准备好核心线程数，准备接收异步任务。
        * 2、核心线程数满了，将进来的异步任务放入阻塞队列当中。
        * 3、阻塞队列满了，就会开启新线程，最大只能开到最大线程数量
        * 4、最大线程数量满了，会按照指定的拒绝策略拒绝执行任务
        * 5、最大线程数都执行完成，会按照指定的存活时间，去释放非核心线程
        * */
        return new ThreadPoolExecutor(config.getCoreSize(),
                config.getMaxSize(),
                config.getKeepAliveTime(),
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(config.getCapacity()),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
    }
}
